package cn.bs.allensocket.mythread;


import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

/**
 * Created by Allen on 2014/11/5.
 * 线程的安全
 */
public class NameList {
    //LinkedList基于链表的数据结构。
    private List nameList = Collections.synchronizedList(new LinkedList());
//    public void add(String name){
//        nameList.add(name);
//    }
//    public String removeFirst(){
//        if (nameList.size() > 0){
//            return (String)nameList.remove(0);
//        }else{
//            return null;
//        }
//    }
//    虽然集合对象
//    private List nameList = Collections.synchronizedList(new LinkedList());
//    是同步的，但是程序还不是线程安全的。
//    出现这种事件的原因是，上例中一个线程操作列表过程中无法阻止另外一个线程对列表的其他操作。
//
//    解决上面问题的办法是，在操作集合对象的NameList上面做一个同步。改写后的代码如下：
    public synchronized void add(String name){
       nameList.add(name);
    }
    public synchronized String removeFirst(){
        if (nameList.size() > 0){
            return (String) nameList.remove(0);
        }
        else{
            return null;
        }
    }

}
